#include <QRegularExpression>
#include <private/datetimeparser/datetimeparser_p.h>
QDateTime DateTimeParserPrivate::num2DataTimeSmart(qint64 num)
{
	int baseYear = 2000;
	if (num < 0)
		return {};

	QString s = QString::number(num);
	int len = s.length();

	int year = 0, month = 1, day = 1, hour = 0, minute = 0, second = 0;

	if (len >= 8)
	{
		// YYYYMMDD
		year = s.midRef(0, 4).toInt();
		month = s.midRef(4, 2).toInt();
		day = s.midRef(6, 2).toInt();
		// 解析时间部分（可选）
		if (len >= 10)
		{
			hour = s.midRef(8, 2).toInt();
			if (len >= 12)
			{
				minute = s.midRef(10, 2).toInt();
				if (len >= 14)
				{
					second = s.midRef(12, 2).toInt();
				}
			}
		}
	}
	else if (len == 6)
	{
		// YYMMDD
		year = 2000 + s.midRef(0, 2).toInt();
		month = s.midRef(2, 2).toInt();
		day = s.midRef(4, 2).toInt();
	}
	else if (len == 5)
	{
		// 前4位为年，第5位为月
		year = s.midRef(0, 4).toInt();
		month = s.midRef(4, 1).toInt();
	}
	else if (len == 4)
	{
		// YYYY
		year = s.toInt();
	}
	else if (len == 3)
	{
		// YMD（例如 251 → 2025年1月1日）
		year = 2000 + s.midRef(0, 2).toInt();
		month = s.midRef(2, 1).toInt();
		// TODO 怎么处理98，2000就要变成1900
	}
	else if (len == 2)
	{
		// YY → 20YY
		year = 2000 + s.toInt();
		//		month = s.midRef(1, 1).toInt();// 你的规则不看月日，固定1月1日
	}
	else if (len == 1)
	{
		// Y → 200Y
		year = 2000 + s.toInt();
	}
	else
	{
		return {};
	}
	// 年份：QDate有效范围1-9999，超出则取当前年份
	year = qBound(1, year, 9999);
	// 月份：强制1-12
	month = qBound(1, month, 12);
	// 日期：按“年+月”取当月最大天数，强制1-最大天数
	QDate tempDate(year, month, 1);// 临时日期取当月1号（确保有效）
	int maxDay = tempDate.daysInMonth();
	day = qBound(1, day, maxDay);
	// 时间：小时0-23（取模容错），分钟/秒0-59（取模容错）
	hour = hour % 24;
	minute = minute % 60;
	second = second % 60;
	QDate date(year, month, day);
	if (!date.isValid())
	{
		return {};
	}

	QTime time(hour, minute, second);
	if (!time.isValid())
	{
		return {};
	}

	return QDateTime(date, time);
}
QDateTime DateTimeParserPrivate::string2DataTimeSmart(QString input)
{
	QRegExp rx("\\D+");// 匹配任意非数字字符作为分隔符
	QStringList numberGroups = input.split(rx, QString::SkipEmptyParts);
	if (numberGroups.size() == 1)
	{
		// 纯数字
		qint64 num = numberGroups[0].toLongLong();
		return num2DataTimeSmart(num);
	}
	else
	{
		// 处理多数字组（非纯数字）
		// 只保留前6组，不足补0（年、月、日、时、分、秒）
		while (numberGroups.size() < 6)
		{
			numberGroups.append("0");
		}
		numberGroups = numberGroups.mid(0, 6);

		// 处理年份（4位，补全世纪）
		int yearNum = numberGroups[0].toInt();
		// 补全为4位（如"25"→25→补全为0025→再处理世纪）
		QString yearStr = QString("%1").arg(yearNum, 4, 10, QChar('0'));
		yearNum = yearStr.toInt();// 重新转换为4位整数（如0025→25）
		// 年份小于1700则补当前世纪（如25→2025，1699→2099）
		if (yearNum < 1700)
		{
			int currentYear = QDate::currentDate().year();
			int centuryPart = (currentYear / 100) * 100;// 如2025→2000
			int lastTwoDigits = yearNum % 100;          // 如25→25，1699→99
			yearNum = centuryPart + lastTwoDigits;
		}

		// 处理月份（1-12，容错00或超范围）
		int month = numberGroups[1].toInt();
		month = qBound(1, month, 12);// 强制限制在1-12（0→1，13→12）

		// 处理日期（1-当月最大天数，容错00或超范围）
		int day = numberGroups[2].toInt();
		// 先构造临时日期获取当月最大天数（年份和月份已校验）
		QDate tempDate(yearNum, month, 1);
		int maxDay = tempDate.daysInMonth();// 当月最大天数（如2月28/29天）
		day = qBound(1, day, maxDay);       // 强制限制在1-maxDay

		// 处理小时（0-23，超范围取模）
		int hour = numberGroups[3].toInt() % 24;
		// 处理分钟（0-59，超范围取模）
		int minute = numberGroups[4].toInt() % 60;
		// 处理秒（0-59，超范围取模）
		int second = numberGroups[5].toInt() % 60;
		// 构造最终QDateTime并验证有效性
		QDateTime dateTime(QDate(yearNum, month, day), QTime(hour, minute, second));
		if (dateTime.isValid())
		{
			return dateTime;
		}
		else
		{
			// 极端情况，返回空
			return {};
		}
	}
}
QString DateTimeParserPrivate::parseDateTimeSmart(QString input, const QString& format)
{
	QDateTime result;
	if (input.isEmpty())
	{
		return {};
	}
	// 使用正则判断是否为纯数字
	static QRegularExpression pureNumberRegex(R"(^\d+$)");
	QRegularExpressionMatch match = pureNumberRegex.match(input);

	if (match.hasMatch())
	{
		bool ok = false;
		qint64 num = input.toLongLong(&ok);
		if (ok)
		{
			result = num2DataTimeSmart(num);
		}
	}
	else
	{
		result = string2DataTimeSmart(input);
	}
	return result.toString(format);
}
